#!/usr/bin/env bash
# ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
# Function :CentOS7.X  批量（drds服务器组内） 执行 命令
# Platform :RedHatEL7.x Based Platform
# Version  :1.02
# Date     :2022-05-04
# Author   :mugoLH
# Contact  :houxiaoshuai@baidu.com & hxsaj@126.com
# ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
#  变量列表 List of common variables
# ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
#  获取主机名列的源文件
HOST_FILE=/etc/hosts
#  默认主机组关键字（可以设为空）
DEFAULT_HOST_KEY="drds"

#  主机组关键字（默认留空）
HOST_KEY=""


#  函数列表 Function list
# ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
info_p(){    printf "\e[1;35;40m%-8s %-20s %-24s %-2s %-2s\e[0m\n" "$(date '+%H:%M:%S')" "${1}" "${2}" "${3}" "${4}" >&1 ;}


help_f(){
    echo -e "说明：\n    pcp2 [ 本地文件或目录 ] [ 远程服务器文件名或目录 ] 实现批量复制本机文件或目录到远程主机"
    echo -e "    pcp2 ~/.ssh /home/work/                   :从本机复制家目录下的.ssh目录到默认服务器组所有服务器的/home/work下"
    echo -e "    pcp2 -g zookeeper ./zk/zoo.cfg /home/     :从本机复制./zk/zoo.cfg文件到到zookeeper服务器组的/home下"
    echo -e "    pcp2 -g zookeeper -f ./host.list ./zoo.cfg /home/  :本机复制复制./zk/zoo.cfg到./host.list文件中指定 zookeeper 关键字的主机名的/home下"
    echo -e "\n可用的选项如下（也可不加选项默认执行所有默认主机）："
    echo -e "    -f or --file  指定IP和主机名文件，类似/etc/hosts"
    echo -e "    -g or --group 指定服务器主机名关键字，也就是主机组，指定在指定的主机组上执行命令"
    echo -e "\n主机名清单类似如下：
#  配置列表 Configuration list
#  ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
#  IP地址         |主机名       | 部署的组件(zk,xdb,dts,smartdba)
#  ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
192.168.123.29    drdsmp01       zookeeper,xdb
192.168.123.111   drdsmp02       zookeeper,xdb
192.168.123.79    drdsnode01     zookeeper
192.168.123.106   drdsnode02
192.168.123.215   drdsbaknode01
"

}
ctl_ops(){
    #  如果未指定主机组，则获取主机文件中所有主机
    if [[ -z ${HOST_KEY} ]];then
        #  获取主机名列表
        Host_NameS=($(grep -Ev "localhost|^#|$(uname -n)" ${HOST_FILE} | awk '{print$2}' | sort | uniq ))
    #  指定主机组，则获取主机文件中指定的主机组
    elif [[ -n ${HOST_KEY} ]]; then
        Host_NameS=($(grep -Ev "localhost|^#|$(uname -n)" ${HOST_FILE} | grep ${HOST_KEY}| awk '{print$2}' | sort | uniq ))
    fi

    #  遍历主机执行命令
    for i in ${Host_NameS[@]};do
        Host_Ip=$(grep -w ${i} ${HOST_FILE} | grep -Ev "^#|$(uname -n)" | awk '{print$1}' | sort | uniq)
        info_p "从本机复制 ${1} ----> " "${i}(${Host_Ip}):${2}"
        scp -pr ${1} ${Host_Ip}:${2}
        echo ""
    done

}
# 如果参数为空，则退出
if [ $# -eq 0 ];then
    exit
elif [[ $# -eq 1 ]]; then
        help_f
else
    #  获取主机组关键字
    while [ -n "$1" ]; do
        case $1 in
            -g | --group)
                HOST_KEY="${2}"
                shift 2
                ;;
            -f | --file )
                HOST_FILE="${2}"
                shift 2
                ;;
            -h | --help )
                help_f
                exit
                ;;
            *)
                break
                ;;
        esac
    done
    #  循环远程执行命令
    if [[ -z ${HOST_KEY} ]] && [[ -f ${HOST_FILE} ]] && [[ -n "${DEFAULT_HOST_KEY}" ]];then
        #  获取主机名列表
        #HOST_KEY="${DEFAULT_HOST_KEY}"
        #  遍历主机执行命令
        ctl_ops "${1}" "${2}"

    elif [[ -n ${HOST_KEY} ]] && [[ -f ${HOST_FILE} ]] && [[ -n "${DEFAULT_HOST_KEY}" ]] ; then
        ctl_ops "${1}" "${2}"

    fi

fi
